#pragma once

#include <iostream>
#include <string>
#include <cstring>
#include <vector>

// 用于进行序列化与反序列化：114+514|19*19|81-0
#define SEP "|"
#define SEP_LEN strlen(SEP)

#define SPACE " "
#define SPACE_LEN strlen(SPACE)

void SpliteMessage(std::string& buffer, std::vector<std::string>& out)
{
    while(true)
    {
        auto pos = buffer.find(SEP);
        if(std::string::npos == pos) break; // 如果是最后一位，不再分隔
        std::string message = buffer.substr(0, pos);
        buffer.erase(0, pos + SEP_LEN); // 将本次的内容从buffer删除
        out.push_back(message);
    }
}

std::string Encode(std::string& s)
{
    return s + SEP;
}

class Request
{
public:
    std::string Serialize() // 序列化
    {
        std::string str;
        str = std::to_string(_x);
        str += SPACE;
        str += _op;
        str += std::to_string(_y);
        return str;
    }

    bool Deserialized(const std::string& str) // 反序列化
    {
        // 获取两元素
        std::size_t left = str.find(SPACE);
        if(left == std::string::npos)
            return false;
        std::size_t right = str.find(SPACE, left + 1);
        if(right == std::string::npos)
            return false;

        _x = std::stoi(str.substr(0, left));
        _y = std::stoi(str.substr(right + SPACE_LEN));
        // 获取操作符
        if(left + SPACE_LEN > str.size())
            return false;
        else 
            _op = str[left + SPACE_LEN];
        
        return true;
    }

public:
    int _x; // 第一位数
    int _y; // 第二位数
    char _op; // 操作符
};

// 计算结果进行相应
class Response
{
public:
    // "code_ result_"
    std::string Serialize() const
    {
        return std::to_string(code_) + SPACE + std::to_string(result_);
    }
    // "111 100"
    bool Deserialized(const std::string &s)
    {
        std::size_t pos = s.find(SPACE);
        if (pos == std::string::npos)
            return false;
        code_ = stoi(s.substr(0, pos));
        result_ = stoi(s.substr(pos + SPACE_LEN));
        return true;
    }

    /*
        int GetResult() const { return result_; }
        void SetResult(int result) { result_ = result; }
        int GetCode() const { return code_; }
        void SetCode(int code) { code_ = code; }
    */

public:
    Response()
    {}
    Response(int result, int code) : result_(result), code_(code)
    {}
    ~Response() {}

public:
    // 约定！
    // result_? code_? code_ 0? 1?2?3?
    int result_; // 计算结果
    int code_;   // 计算结果的状态码
};
